#!/bin/bash
# VPN 服务器一键部署脚本
# 用法：sudo bash setup_vpn.sh

set -e

echo "=== VPN 服务器部署脚本 ==="

# 检查 root 权限
if [ "$EUID" -ne 0 ]; then
    echo "错误：需要 root 权限运行"
    exit 1
fi

# 检查系统
if [ ! -f /etc/os-release ]; then
    echo "错误：无法识别的 Linux 发行版"
    exit 1
fi

echo "1. 安装依赖..."
apt-get update -qq
apt-get install -y python3 python3-pip iproute2 iptables openssl

# 检查 TUN 支持
echo "2. 检查 TUN/TAP 支持..."
if [ ! -c /dev/net/tun ]; then
    echo "加载 TUN 模块..."
    modprobe tun
    echo "tun" >> /etc/modules
fi
chmod 666 /dev/net/tun

# 生成证书（如果不存在）
echo "3. 生成 TLS 证书..."
if [ ! -f server.crt ]; then
    openssl req -x509 -newkey rsa:4096 \
        -keyout server.key -out server.crt \
        -days 365 -nodes \
        -subj "/CN=vpn-server" \
        2>/dev/null
    chmod 600 server.key
    echo "证书已生成: server.crt, server.key"
else
    echo "证书已存在，跳过生成"
fi

# 获取物理网卡名称
echo "4. 检测网络接口..."
INTERFACE=$(ip route | grep default | awk '{print $5}' | head -n1)
if [ -z "$INTERFACE" ]; then
    INTERFACE="eth0"
    echo "警告：无法自动检测网卡，使用默认值: $INTERFACE"
else
    echo "检测到物理网卡: $INTERFACE"
fi

# 生成配置文件
echo "5. 生成配置文件..."
cat > vpn_server.conf <<EOF
# VPN 服务器配置文件
BIND_HOST=0.0.0.0
BIND_PORT=8443
AUTH_TOKEN=$(openssl rand -hex 16)
CERT_FILE=server.crt
KEY_FILE=server.key
TUN_NAME=vpn0
VPN_NETWORK=10.8.0.0/24
SERVER_IP=10.8.0.1
PHYSICAL_INTERFACE=$INTERFACE
ENABLE_NAT=yes
EOF

echo "配置文件已生成: vpn_server.conf"
echo ""
echo "认证令牌: $(grep AUTH_TOKEN vpn_server.conf | cut -d= -f2)"
echo ""

# 生成启动脚本
cat > start_vpn_server.sh <<'EOF'
#!/bin/bash
# 启动 VPN 服务器

source vpn_server.conf

python3 tun_vpn_server.py \
    --bind-host $BIND_HOST \
    --bind-port $BIND_PORT \
    --auth-token $AUTH_TOKEN \
    --cert $CERT_FILE \
    --key $KEY_FILE \
    --tun-name $TUN_NAME \
    --vpn-network $VPN_NETWORK \
    --server-ip $SERVER_IP \
    --physical-interface $PHYSICAL_INTERFACE \
    $([ "$ENABLE_NAT" = "yes" ] && echo "--enable-nat")
EOF

chmod +x start_vpn_server.sh

echo "6. 部署完成！"
echo ""
echo "启动服务器："
echo "  sudo ./start_vpn_server.sh"
echo ""
echo "客户端连接命令（在客户端机器上执行）："
echo "  sudo python3 tun_vpn_client.py \\"
echo "    --server-host $(hostname -I | awk '{print $1}') \\"
echo "    --server-port 8443 \\"
echo "    --auth-token $(grep AUTH_TOKEN vpn_server.conf | cut -d= -f2) \\"
echo "    --client-id client-001 \\"
echo "    --ca-cert server.crt \\"
echo "    --route-all"
echo ""
echo "注意：需要将 server.crt 复制到客户端机器"
